package cn.smxy.works.controller;

import cn.smxy.param.*;
import cn.smxy.pojo.Category;
import cn.smxy.pojo.Plant;
import cn.smxy.pojo.PlantPicture;
import cn.smxy.util.R;
import cn.smxy.vo.PlantVo;
import cn.smxy.works.service.PlantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/works")
public class PlantController {

    @Autowired
    private PlantService plantService;

    /**
     * 上传植物作品接口
     *
     * @param plantAddParam 植物实体类，包括多张图片属性
     * @param result
     * @return
     */
    @PostMapping("/add")
    public R add(@RequestBody @Validated PlantAddParam plantAddParam, BindingResult result) {
        if (result.hasErrors()) {
            return R.fail("参数异常，上传失败");
        }
        // 因科属名为同一字段，所以如果属名ID不为null，将科属名置为属名ID
        Long genusId = plantAddParam.getGenusId();
        if(genusId != null) {
            plantAddParam.setFamilyId(genusId);
        }
        return plantService.add(plantAddParam);
    }

    /**
     * 删除植物作品接口
     *
     * @param plantRemoveParam 用户id和植物id
     * @param result
     * @return
     */
    @PostMapping("/remove")
    public R remove(@RequestBody @Validated PlantRemoveParam plantRemoveParam, BindingResult result) {
        if (result.hasErrors()) {
            return R.fail("参数异常，删除失败");
        }
        return plantService.remove(plantRemoveParam);
    }

    /**
     * 修改植物作品接口
     *
     * @param plant 植物实体类
     * @return
     */
    @PutMapping("/update")
    public R update(@RequestBody Plant plant) {
        return plantService.update(plant);
    }

    /**
     * 植物作品校园认证接口
     * 添加植物后，如果是学生用户，额外添加校园地址可以完成校园认证
     *
     * @param plantCampusParam 用户id，植物id，学校id，校园内地址
     * @return
     */
    @PostMapping("/campus")
    public R campus(@RequestBody @Validated PlantCampusParam plantCampusParam, BindingResult result) {
        if (result.hasErrors()) {
            return R.fail("参数异常，认证失败");
        }
        return plantService.campus(plantCampusParam);
    }

    /**
     * 单种群多科属分页展示接口
     *
     * @param plantPageParam 分页参数
     * @return
     */
    @PostMapping("/page")
    public R page(@RequestBody PlantPageParam plantPageParam) {
        return plantService.page(plantPageParam);
    }

    /**
     * 查看植物图片集接口(多张图片)
     *
     * @param plantId 植物id
     * @return 植物图片集合
     */
    @GetMapping("/picture/{plantId}")
    public R picture(@PathVariable Long plantId) {
        return plantService.picture(plantId);
    }

    /**
     * 查看植物详情接口
     *
     * @param plantId 植物id
     * @return
     */
    @GetMapping("/detail/{plantId}")
    public R detail(@PathVariable Long plantId) {
        return plantService.detail(plantId);
    }

    /**
     * es搜索接口
     * @param plantSearchParam
     * @return
     */
    @PostMapping("/search")
    public R search(@RequestBody PlantSearchParam plantSearchParam) {
        return plantService.search(plantSearchParam);
    }

    /**
     * 获取植物信息接口
     * @param plantId
     * @return
     */
    @GetMapping("/info/{plantId}")
    public PlantVo info(@PathVariable Long plantId) {
        return plantService.info(plantId);
    }

    /**
     * 获取所有植物列表接口
     * 提供给es
     * @return
     */
    @GetMapping("/list")
    public List<Plant> list() {
        return plantService.list();
    }

    // TODO: 管理员模块

    /**
     * 展示所有植物图片接口
     * @param search
     * @return
     */
    @PostMapping("/picture/all")
    public List<PlantPicture> pictureAll(@RequestParam("search") String search) {
        return plantService.pictureAll(search);
    }

    /**
     * 返回各种群作品数量接口
     * 用户数据可视化
     * @param list
     * @return
     */
    @PostMapping("/count")
    public int[] getCount(@RequestBody List<Category> list) {
        return plantService.getCount(list);
    }

    /**
     * 删除用户对应作品接口
     * @param userId
     * @return
     */
    @DeleteMapping("/remove/{userId}")
    public R removeByUserId(@PathVariable Long userId) {
        return plantService.removeByUserId(userId);
    }

}
